package JVM.第06篇_垃圾回收篇;

/**
 * 内存溢出
 * ●内存溢出相对于内存泄漏来说，尽管更容易被理解，但是同样的，内存溢出也是引发程序崩溃的罪魁祸首之一。
 * ●由于GC一直在发展，所有一般情况下，除非应用程序占用的内存增长速度非常快，
 * 造成垃圾回已经跟不上内存消耗的速度，否则不太容易出现OOM的情况。
 * ●大多数情况下，GC会进行各种年龄段的垃圾回收，实在不行了就放大招，
 * 来次独占式的Full GC操作，这时候会回收大量的内存，供应用程序继续使用。
 * ●javadoc中对OutOfMemoryError的解释是，没有空闲内存，并且垃圾收集器也无法提供更多内存。
 *
 *
 * 内存不够的原因?
 * ●首先说没有空闲内存的情况:说明Java虛拟机的堆内存不够。原因有二:
 * (1) Java虚拟机的堆内存设置不够。
 * 比如:可能存在内存泄漏问题;也很有可能就是堆的大小不合理，
 * 比如我们要处理比较可观的数据量，但是没有显式指定JVM堆大小或者指定数值偏小。
 * 我们可以通过参数 -Xms、-Xmx来调整。
 * (2)代码中创建了大量大对象，并且长时间不能被垃圾收集器收集(存在被引用)
 * 对于老版本的Oracle JDK， 因为永久代的大小是有限的，
 * 并且JVM对永久代垃圾回收(如常量池回收、卸载不再需要的类型)非常不积极，
 * 所以当我们不断添加新类型的时候，久代出现0utOfMemoryError也非常多见，
 * 尤其是在运行时存在大量动态类型生成的场合;
 * 类似intern字符串缓存占用太多空间，也会导致OOM问题。对应的异常信息，
 * 会标记出来和永久代相关:“java.lang.OutOfMemoryError: PermGen space”。
 *
 * ●随着元数据区的引入，方法区内存已经不再那么窘迫，所以相应的OOM有所改观，出现OOM，
 * 异常信息则变成了: “java.lang.OutOfMemoryError: Metaspace"。
 * 直接内存不足，也会导致OOM。
 *
 * OOM前必有GC?
 * ●这里面隐含着一层意思是， 在抛出OutOfMemoryError之前，
 * 通常垃圾收集器会被触发，尽其所能去清理出空间。
 *      ●例如:在引用机制分析中，涉及到JVM会去尝试回收软引用指向的对象等。
 *      ●在java.nio.BIts.reserveMemory()方法中，我们能清楚的看到，System.gc()会被调用，以清理空间。
 * ●当然，也不是在任何情况下垃圾收集器都会被触发的
 *      ●比如，我们去分配一个超大对象，类似一个超大数组超过堆的最大值，
 *      JVM可 以判断出垃圾收集并不能解决这个问题，所以直接抛出0utOfMemoryError.
 *
 */
public class F3_内存溢出 {

}
